package cn.bookcycle.panda.pay.util;

import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;

import org.json.JSONException;
import org.json.JSONObject;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import cn.bookcycle.panda.pay.constant.BusinessData;
import cn.bookcycle.panda.pay.constant.NameData;
import cn.bookcycle.panda.pay.constant.WeChatData;
import cn.bookcycle.panda.pay.pojo.ParametersBase;


/**
 * 请求工具类
 *
 * @author liufenglin
 * @date 2018年1月29日
 */
public class ServiceRequest {
	/**日志*/
	private static final Logger logger = LoggerFactory.getLogger(ServiceRequest.class);
	
	/**
	 * 把微服务系统中的参数名替换为微信接口的参数名
	 * 
	 * @param parameter 微服务系统中的参数名
	 * @return 对应微信接口的参数名或者null
	 */
	public static String parameterNameReplace(String parameter) {
//		// 标志位
//		boolean flag = false;
//		for (int i = 0; i < BusinessData.NECESSARY_PARAMETERS_MAP.size(); ++i) {
//			if (BusinessData.NECESSARY_PARAMETERS_MAP[i][0].equals(parameter)) {
//				// 找到了参数名对应的微信接口的参数名，就进行替换
//				parameter = BusinessData.NECESSARY_PARAMETERS_MAP[i][1];
//				// 修改标志位
//				flag = true;
//				// 终止查找过程
//				break;
//			} else {}
//		} // end for
//		if (flag == false) {
//			// 如果遍历完后，没找到对应的微信接口的参数名，就把参数名置为null，作为提示
//			parameter = null;
//		} else {}
		return BusinessData.NECESSARY_PARAMETERS_MAP.get(parameter);
	}
	
	
	/**
	 * 把json字符串分解为，请求微信支付接口的必要参数和非必要参数，并装入map中
	 * 
	 * @param jsonStr json字符串
	 * @return
	 * @throws JSONException
	 */
	public static Map<String, Map<String, Object>> getJsonParamaters(String jsonStr) throws JSONException {
		logger.info("getJsonParamaters传入的json是：{}", jsonStr);
		// 微信接口的必须请求参数键值对
		Map<String, Object> necessaryParametersMap = new HashMap<String, Object>();
		// 微信接口的可选请求参数的键值对
		Map<String, Object> alternativeParametersMap = new HashMap<String, Object>();
		if (jsonStr != null) {
			JSONObject jsonObject = new JSONObject(jsonStr);
			// 获取所有json数据的键值
			Iterator<String> it = jsonObject.keys();
			while (it.hasNext()) {
				String key = it.next();
				Object value = jsonObject.get(key);
				if (BusinessData.NECESSARY_PARAMETERS_STR.contains(key)) {
					// key是微服务系统中的参数名
					String tempParameter = parameterNameReplace(key);
					if (tempParameter != null) {
						// 把微信接口的必须参数的参数名替换成微信接口的参数名
						key = tempParameter;
					} else {}
					// 把必须的请求参数名和值存到necessaryParametersMap
					necessaryParametersMap.put(key, value);
					logger.info("==========necessaryParameters==========");
					logger.info("key:{}  value:{}", key, value);
				} else {
					// 把可选的请求参数名和值存到alternativeParametersMap
					alternativeParametersMap.put(key, value);
					logger.info("==========alternativeParameters==========");
					logger.info("key:{}  value:{}", key, value);
				}
			} // end while
		} else {}
		// 把必须参数组成的map和可选参数组成的map装入参数map，作为返回值
		Map<String, Map<String, Object>> parametersMap = new HashMap<String, Map<String, Object>>();
		parametersMap.put(NameData.NECESSARY_PARAMETERS, necessaryParametersMap);
		parametersMap.put(NameData.ALTERNATIVE_PARAMETERS, alternativeParametersMap);
		logger.info("微服务接收的参数组成的map{}", parametersMap);
		return parametersMap;
	}
	
	
	/**
	 * 向微信支付接口发送请求
	 * 
	 * @param map 必须的请求参数键值对组成的map
	 * @return
	 */
	public static String requestWechatPay(Map<String, Object> map) {
		logger.info("请求微信支付接口必须参数组成的map{}", map);
		// 根据account参数来初始化部分签名参数
		WechatUtil.initSignPara(map.get(NameData.ACCOUNT).toString());
		// 产生随机串
		String nonceStr = WechatUtil.generateNonceStr();
		// 把必要参数，放到参数对象中
		ParametersBase parameter = new ParametersBase(map);
		// map中的account已经找到了对应的appId、mchId，并放到parameter对象中，account可以被移除了
		map.remove(NameData.ACCOUNT);
		// 调用者的notifyUrl已经存到了数据库中，应该被移除掉
		logger.info("没有删除notifyUrl的map！！！！！！！！：{}", map.toString());
		map.remove(BusinessData.NECESSARY_PARAMETERS_MAP.get(NameData.NOTIFY_URL));
		logger.info("已经删除notifyUrl的map！！！！！！！！：{}", map.toString());
		// 把所有的请求参数拼接成XML格式的String数据
		String xmlStr = DataFormatConvert.mapToXML(map);
		// 给xmlStr附加appId（由account决定）、mchId（由account决定）、nonceStr（每次变化）、sign（根据随机串变化而变化）、notifyUrl（微服务的地址）、tradeType（固定）
		xmlStr = DataDeal.addXMLData(xmlStr, parameter);
		logger.warn("向微信接口请求的XMLStr{}", xmlStr);
		// 带上XML数据发送https POST请求
		String result = Request.httpsRequest(WeChatData.PAY_ORDER_URL, NameData.POST, xmlStr);
		logger.warn("请求微信后返回的result:{}", result);
		// 返回响应的结果
		return result;
	}
}
